﻿package com.teaphy.coroutinecrawler.exception

import kotlinx.coroutines.*

fun main() = runBlocking {
    // 当调用cancel取消协程时，协程内部使用 CancellationException 来执行取消操作。
    // 这个异常通常可以忽略。其可以被catch代码块捕获的异常仅仅应该被用来作为额外调试信息的资源。
    //
    // 当父协程的所有子协程都结束后，原始的异常才会被父协程处理。
    val job = launch {
        val child = launch {
            try {
                delay(Long.MAX_VALUE)
            } catch (e: Exception) {
                println("exception: $e")
            } finally {
                println("Child is cancelled")
            }
        }
        yield()
        println("Cancelling child")
        child.cancel()
        child.join()
        yield()
        // 当一个协程使用 Job.cancel 取消的时候，它会被终止，但是它不会取消它的父协程。
        println("Parent is not cancelled")
    }
    job.join()
}